package org.springframework.howelly.controllers;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.binding.message.MessageBuilder;
import org.springframework.binding.message.MessageContext;
import org.springframework.howelly.helpers.SearchCriteria;
import org.springframework.howelly.model.Categoria;
import org.springframework.howelly.model.Obra;
import org.springframework.howelly.services.ObraService;
import org.springframework.howelly.utils.Constants;
import org.springframework.howelly.validators.ObraValidator;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.webflow.execution.RequestContext;

/**
 * A controller handling requests for showing and updating an Account.
 */
@Controller
@SessionAttributes("searchCriteria")
public class ObraController {

    private ObraService obraService;

    @Autowired
    public ObraController(ObraService obraService) {
	this.obraService = obraService;
    }

    public List<Obra> findObras(SearchCriteria criteria, RequestContext context) {
	return obraService.findObras(criteria);
    }

    public Obra findObraById(Obra obra) {
	return obraService.findObrasById(obra.getId());
    }

    @RequestMapping(method = RequestMethod.POST)
    public String onSubmit(@ModelAttribute("searchCriteria") SearchCriteria searchCriteria, BindingResult result,
	    SessionStatus status) {
	status.setComplete();
	return "redirect:/obra/reviewObras";
    }

    public boolean createObra(Obra obra, MessageContext context) {
	if (ObraValidator.validateCategorias(obra, context))
	    return true;
	obraService.createObra(obra);
	return false;
    }

    public boolean updateObra(Obra obra, MessageContext context) {
	if (ObraValidator.validateCategorias(obra, context))
	    return true;
	obraService.updateObra(obra);
	return false;
    }

    public boolean deleteObra(Obra obra, MessageContext context) {
	if (obra.getGastos().isEmpty()) {
	    boolean result = obraService.deleteObra(obra);
	    context.addMessage(new MessageBuilder().info().source("borrar").defaultText(
		    "La Obra fue eliminada exitosamente").build());

	    return result;

	}
	context.addMessage(new MessageBuilder().error().source("borrar").defaultText(
		"La Obra no puede tener gastos existentes, elimine todos los gastos de la obra para borrarla").build());
	return true;
    }

    public Obra initObra() {
	Obra newObra = new Obra();
	initCategorias(newObra);
	return newObra;
    }

    private void initCategorias(Obra obra) {
	Categoria bienesDeUso = new Categoria(Constants.BIENES_DE_USO, 0);
	Categoria combustibles = new Categoria(Constants.COMBUSTIBLES_Y_LUBRICANTES, 0);
	Categoria equipos = new Categoria(Constants.EQUIPOS, 0);
	Categoria fletes = new Categoria(Constants.FLETES, 0);
	Categoria gastosFinancieros = new Categoria(Constants.GASTOS_FINANCIEROS, 0);
	Categoria gastosGenerales = new Categoria(Constants.GASTOS_GENERALES, 0);
	Categoria honorarios = new Categoria(Constants.HONORARIOS_DIRECTORES, 0);
	Categoria impuestos = new Categoria(Constants.IMPUESTOS, 0);
	Categoria inspeccion = new Categoria(Constants.INSPECCION, 0);
	Categoria materiales = new Categoria(Constants.MATERIALES, 0);
	Categoria manoDeObraPropia = new Categoria(Constants.MANO_DE_OBRA_PROPIA, 0);
	Categoria movilidades = new Categoria(Constants.MOVILIDADES, 0);
	Categoria repuestos = new Categoria(Constants.REPUESTOS_Y_REPARACIONES, 0);
	Categoria subcontratistas = new Categoria(Constants.SUBCONTRATISTAS, 0);
	Categoria viaticos = new Categoria(Constants.VIATICOS, 0);

	List<Categoria> categorias = (ArrayList<Categoria>) obra.getCategorias();
	categorias.add(bienesDeUso);
	categorias.add(combustibles);
	categorias.add(equipos);
	categorias.add(fletes);
	categorias.add(gastosFinancieros);
	categorias.add(gastosGenerales);
	categorias.add(honorarios);
	categorias.add(impuestos);
	categorias.add(inspeccion);
	categorias.add(materiales);
	categorias.add(manoDeObraPropia);
	categorias.add(movilidades);
	categorias.add(repuestos);
	categorias.add(subcontratistas);
	categorias.add(viaticos);

    }
}
